El valor primitivo de Javascript del que nadie habla: Symbol

Previamente Javascript contaba con 5 valores primitivos:

  • Number
  • String
  • Boolean
  • null
  • undefined

Pero en ES6 (o ES2015) Symbol se agregó a Javascript.

Es un un valor único. Y su único propósito es ser usada como identificador para asignar las propiedades a un objeto quitando el riesgo de que colisionar con otras propiedades que puedan añadirsele.

Veamos un ejemplo de creación de Symbol:

Symbol()

const s1 = Symbol() // Symbol()
const s2 = Symbol(1234) // Symbol(1234)
const s3 = Symbol('The Symbol') // Symbol(The Symbol)
const s4 = Symbol({}) // Symbol([object Object])

const s5 = Symbol() // Symbol()
const s6 = Symbol(1234) // Symbol(1234)
const s7 = Symbol('The Symbol') // Symbol(The Symbol)
const s8 = Symbol({}) // Symbol([object Object])

¡Pero un momento! Claramente hay 2 variables con el mismo valor Symbol asignado. Por lo tanto no son únicos.

¡Error! Intenta compararlos…y observa el resultado.

console.log(s1 === s5) // false
console.log(s2 === s6) // false
console.log(s3 === s7) // false
console.log(s4 === s8) // false

La realidad es que Symbol() no usa el valor que le pasas. Symbol() asigna el parámetro que le proporcionas como una descripción del mismo, pero el valor que tiene es único.

*No olvides de que a pesar de que Symbol parezca un objeto en realidad es un primitivo.

Symbol.for()

A pesar de que las llamadas anteriores técnicamente crean un Symbol, realmente no es la llamada que quieres hacer si vas a utilizar Symbols en tu código.

Si quieres un Symbol versátil que sea capaz de compartirse entre diferentes archivos necesitas usar Symbol.for().

Esta función busca un Symbol creado previamente pasandole un parámetro key. Esta key (llave) sirve como identificador del Symbol. Si Javascript encuentra el Symbol con esa key lo regresa y si no procede a crearlo.

¿Qué pasa si hay múltiples valores asignados a la misma key? Ese es el caso con los pares de variables del ejemplo anterior, como s1 y s5.

En ese caso se ignora la existencia de los demás ya que solo se regresa el primero que se encuentre.

Por lo tanto, es perfectamente lógico ver que la siguiente comparación regresa true:

console.log(Symbol.for('Hello') === Symbol.for('Hello')) // true

Symbol.keyFor()

Es la función inversa de Symbol.for(). Acepta un Symbol como parámetro y te regresa la llave del mismo.

Esto quiere decir que necesita haber creado un Symbol forzosamente con una llave. Osea haverlo creado con Symbol.for(). De lo contrario Symbol.keyFor() regresará undefined.

const s1 = Symbol(true) // Symbol(true)
const s2 = Symbol.for(666) // Symbol(666)

const sKey1 = Symbol.keyFor(s1) // undefined
const sKey2 = Symbol.keyFor(s2) // 666

El uso de Symbols es raro en cualquier proyecto. Este dato primitivo se creó principalmente para facilitar la implementación interna de algunas partes de Javascript.

No obstante ahora entiendes su funcionamiento básico y ya no es sólo ese valor primitivo del que nadie habla.

Aunque seamos sinceros, dudo mucho que empieces a usarlo muy seguido.